package com.xing.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.core.annotation.Order;
import org.springframework.core.env.Environment;
import org.springframework.core.env.Profiles;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;

import java.util.ArrayList;

@Configuration
public class SwaggerConfig {
    /**
     * 添加资源处理程序
     * @param registry
     */
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 解决静态资源无法访问
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
        // 解决swagger无法访问
        registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        // 解决swagger的js文件无法访问
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
    @Bean
    public Docket docketA(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("A同学");
    }
    @Bean
    public Docket docketB(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("B同学");
    }
    @Bean
    public Docket docketC(){
        return new Docket(DocumentationType.SWAGGER_2).groupName("C同学");
    }

    // 配置了Swagger的Docket的bean实例
    @Bean
    public Docket docket(Environment environment) {
        // 设置需要显示的 Swagger 环境
        // Swagger环境这里没有添加 proda 这个环境，那么使用proda配置时下面定义的wzx这个分组名称不会映射到swagger-UI文档上面
        Profiles profiles = Profiles.of("dev","prod","test","deva");
        // 通过 environment.acceptsProfiles(profiles) 判断是否处在自己设定的环境当中 获取项目环境
        boolean b = environment.acceptsProfiles(profiles); //在enable关联测试 使用dev 和 prod 测试
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .groupName("wzx") //分组名称 default
                .enable(b) //enable是否启动Swagger，如果为False，则Swagger不能再浏览器中访问 false
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.xing.controller"))
                //.paths(PathSelectors.ant("/xing/**")) //过滤
                .build();
              /** RequestHandlerSelectors 配置需要扫描接口的方式
                * basePackage()： 指定需要扫描的包
                * any(): 扫描全部
                * none(): 不扫描
                * withClassAnnotation(例如：RestController.class): 扫描类上的注解，参数是一个注解的反射对象
                * withMethodAnnotation(): 扫描方法上的注解  */
    }
    // 配置Swagger的ApiInfo信息
    private ApiInfo apiInfo() {
        Contact contact = new Contact("我的博客","https://weibo.com/u/5360827707","13629664531@163.com");
        return new ApiInfo(
                "我的API文档",
                "这是系统后端的API文档",
                "1.0",
                "https://weibo.com/u/5360827707",
                contact,
                "My Apache 2.0 Test",
                "http://localhost:8081/hello",
                new ArrayList());
    }

}
